package controller

import (
	"context"
	"mldong/api/base"
	dictApi "mldong/api/dict"
	"mldong/internal/modules/sys/logic"
	"mldong/internal/modules/sys/service"
	"mldong/utility"

	"github.com/gogf/gf/v2/frame/g"
)

func init() {
	// 注册控制器时自动注入依赖
	utility.RegisterController(&DictController{
		// dictService: utility.MustResolve(service.DictServiceType).(service.IDictService),
		// 控制层使用强依赖logic的方式，保证逻辑层的init方法比controller的方法先执行
		dictService: utility.MustResolve(service.DictServiceType).(*logic.DictLogic),
	})
}

type DictController struct {
	dictService service.IDictService
}

// 保存字典
func (ctrl *DictController) Save(ctx context.Context, req *dictApi.SaveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.dictService.Save(req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("保存字典失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 修改字典
func (ctrl *DictController) Update(ctx context.Context, req *dictApi.UpdateReq) (res *base.CommonResult, err error) {
	success, err := ctrl.dictService.Update(req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("修改字典失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 删除字典
func (ctrl *DictController) Remove(ctx context.Context, req *dictApi.RemoveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.dictService.Remove(req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("删除字典失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 获取字典详情
func (ctrl *DictController) Detail(ctx context.Context, req *dictApi.DetailReq) (res *dictApi.DetailRes, err error) {
	// 设置 JSON 数据
	jsonData, err := ctrl.dictService.Detail(req.ID)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 分页查询字典列表
func (ctrl *DictController) Page(ctx context.Context, req *dictApi.PageReq) (res *dictApi.PageRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.dictService.Page(req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 根据字典编码获取字典
func (ctrl *DictController) GetByDictType(ctx context.Context, req *dictApi.GetByDictTypeReq) (res *dictApi.GetByDictTypeRes, err error) {
	jsonData, err := ctrl.dictService.GetByDictType(req.DictType)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 枚举字典
func (ctrl *DictController) EnumDictList(ctx context.Context, req *dictApi.EnumDictListReq) (res *dictApi.DictModelListRes, err error) {
	jsonData := utility.GetEnums()
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 自定义字典
func (ctrl *DictController) CustomDictList(ctx context.Context, req *dictApi.CustomDictListReq) (res *dictApi.DictModelListRes, err error) {
	jsonData := utility.GetCustomDict()
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}
